// 删除问题的延伸——dummy 结点登场

/**
 * 真题描述：
 * 给定一个排序链表，删除所有含有重复数字的结点，只保留原始链表中 没有重复出现的数字。
 *
 * 示例 1:
 * 输入: 1->2->3->3->4->4->5
 * 输出: 1->2->5
 * 示例 2:输入: 1->1->1->2->3
 * 输出: 2->3
 */
import { ListNode } from '../types'

const deleteDuplicates2 = (head: ListNode) => {
	if (!head || !head.next) return head

	let dummy = new ListNode()
	dummy.next = head

	let cur = dummy
	while (cur.next && cur.next.next) {
		if (cur.next.val === cur.next.next.val) {
			let val = cur.next.val

			while (cur.next && cur.next.val === val) {
				cur.next = cur.next.next
			}
		} else {
			cur = cur.next
		}
	}

	return dummy.next
}

// 其实在链表题中，经常会遇到这样的问题：
// 链表的第一个结点，因为没有前驱结点，导致我们面对它无从下手。这时我们就可以用一个 dummy 结点来解决这个问题。
// 所谓 dummy 结点，
// 就是咱们人为制造出来的第一个结点的前驱结点，这样链表中所有的结点都能确保有一个前驱结点，也就都能够用同样的逻辑来处理了。
// dummy 结点能够帮助我们降低链表处理过程的复杂度，处理链表时，不设 dummy 结点思路可能会打不开；设了 dummy 结点的话，就算不一定用得上，也不会出错。所以笔者个人非常喜欢用 dummy 结点。有心的同学可能也会注意到，在本节的第一题“链表的合并”中，其实也有 dummy 结点的身影。
